package com.lonewalker.sparrow.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.lonewalker.sparrow.entity.SysUser;
import com.lonewalker.sparrow.listener.excel.UserListener;
import com.lonewalker.sparrow.service.UserService;
import com.lonewalker.sparrow.util.FileUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * @author lonewalker
 */
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/excel")
public class ExcelController {

    private final UserService userService;


    @GetMapping("/simpleRead")
    public void simpleRead(){
        // 写法1：JDK8+ ,不用额外写一个DemoDataListener
        // since: 3.0.0-beta1
        String fileName = FileUtil.getPath() + "excel" + File.separator + "user.xlsx";
        // 这里 需要指定读用哪个class去读，然后读取第一个sheet 文件流会自动关闭
        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        EasyExcel.read(fileName, SysUser.class, new PageReadListener<SysUser>(userList -> {
            for (SysUser user : userList) {
                log.info("读取到一条数据{}", user.toString());
            }
        })).sheet().doRead();
    }

    @GetMapping("/repeatedRead")
    public void repeatedRead(){

        String fileName = FileUtil.getPath() + "excel" + File.separator + "user.xlsx";
        // 读取全部sheet
        // 这里需要注意 DemoDataListener的doAfterAllAnalysed 会在每个sheet读取完毕后调用一次。然后所有sheet都会往同一个DemoDataListener里面写
        EasyExcel.read(fileName, SysUser.class, new UserListener(userService)).doReadAll();

        // 读取部分sheet
        fileName = FileUtil.getPath() + "demo" + File.separator + "demo.xlsx";

        // 写法1
        try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {
            // 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
            ReadSheet readSheet1 =
                    EasyExcel.readSheet(0).head(SysUser.class).registerReadListener(new UserListener(userService)).build();
            ReadSheet readSheet2 =
                    EasyExcel.readSheet(1).head(SysUser.class).registerReadListener(new UserListener(userService)).build();
            // 这里注意 一定要把sheet1 sheet2 一起传进去，不然有个问题就是03版的excel 会读取多次，浪费性能
            excelReader.read(readSheet1, readSheet2);
        }
    }

    @GetMapping("/simpleWrite")
    public void simpleWrite(){
        // 注意 simpleWrite在数据量不大的情况下可以使用（5000以内，具体也要看实际情况），数据量大参照 重复多次写入
        List<SysUser> userList = userService.list();
        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName = FileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        Set<String> excludeColumnFiledNames = new HashSet<>();
        //忽略删除标识
        excludeColumnFiledNames.add("deletedTag");
        EasyExcel.write(fileName, SysUser.class).excludeColumnFieldNames(excludeColumnFiledNames).sheet("模板").doWrite(userList);
    }


}
